htaccess mod 即使文件夹存在也重写
htaccess mod rewrite even if folder exists
我正在建立一个网站,我刚刚发现我遇到了这个问题。
当用户去www.website.com/something我要htaccess打开 www.website.com/index.php?s=something ,这适用于我当前的重定向,除非我有 "something" 作为现有文件夹。
"s"代表"subpage"
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]
只有当文件夹存在时我才会遇到问题 (/js /css /images ..etc) 所以当我尝试访问 www.website.com/images 它仍然显示正确的页面,但它在地址栏 www.website.com/images/?s=images 中显示。需要注意的一件事是,如果我将 ?s=images 更改为 ?s=images213123 php 仍然只将 /images/ 识别为 $_GET['s'];
我没有使用 htaccess 的经验,但这是我到目前为止整理的内容,也许问题出在其他地方,而不是在上面的行中。
我尝试将 [L] 移动到第三条规则,尝试将有问题的规则与其余规则分开,以我有限的知识尝试了所有可能的方法,但我什么都做不了。
非常感谢任何提示或想法!
提前谢谢你
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /.php
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=&c=
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]
ErrorDocument 400 /index.php
ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
ErrorDocument 500 /index.php
编辑:添加 "DirectorySlash Off" 并按照@Jon Lin 的回答更改条件和规则解决了该问题。我还必须清除 Firefox 缓存才能看到更改。这是我最终的 htaccess,可以很好地满足我的目的。
Options +FollowSymlinks
RewriteEngine On
DirectorySlash Off
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=&c=
# I intentionally skipped the conditions here
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]
ErrorDocument 400 /index.php
ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
ErrorDocument 500 /index.php
重写条件仅应用于紧随其后的规则,因此您有 1 个条件和 4 个规则。这 1 个条件仅适用于第一个规则,其他 3 个没有条件与之相关。您需要确保所有 4 条规则都不会应用于对现有文件或目录的请求:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/<userpage>/([a-zA-Z0-9_-]+)/?$ /c.php?s=&c=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]
我正在建立一个网站,我刚刚发现我遇到了这个问题。
当用户去www.website.com/something我要htaccess打开 www.website.com/index.php?s=something ,这适用于我当前的重定向,除非我有 "something" 作为现有文件夹。
"s"代表"subpage"
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]
只有当文件夹存在时我才会遇到问题 (/js /css /images ..etc) 所以当我尝试访问 www.website.com/images 它仍然显示正确的页面,但它在地址栏 www.website.com/images/?s=images 中显示。需要注意的一件事是,如果我将 ?s=images 更改为 ?s=images213123 php 仍然只将 /images/ 识别为 $_GET['s'];
我没有使用 htaccess 的经验,但这是我到目前为止整理的内容,也许问题出在其他地方,而不是在上面的行中。 我尝试将 [L] 移动到第三条规则,尝试将有问题的规则与其余规则分开,以我有限的知识尝试了所有可能的方法,但我什么都做不了。
非常感谢任何提示或想法! 提前谢谢你
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /.php
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=&c=
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]
ErrorDocument 400 /index.php
ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
ErrorDocument 500 /index.php
编辑:添加 "DirectorySlash Off" 并按照@Jon Lin 的回答更改条件和规则解决了该问题。我还必须清除 Firefox 缓存才能看到更改。这是我最终的 htaccess,可以很好地满足我的目的。
Options +FollowSymlinks
RewriteEngine On
DirectorySlash Off
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=&c=
# I intentionally skipped the conditions here
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]
ErrorDocument 400 /index.php
ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
ErrorDocument 500 /index.php
重写条件仅应用于紧随其后的规则,因此您有 1 个条件和 4 个规则。这 1 个条件仅适用于第一个规则,其他 3 个没有条件与之相关。您需要确保所有 4 条规则都不会应用于对现有文件或目录的请求:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/<userpage>/([a-zA-Z0-9_-]+)/?$ /c.php?s=&c=
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s= [L]