即使文件夹存在,也要使用htaccess mod rewrite

3
我正在建设一个网站,发现了一个问题。
当用户访问 www.website.com/something 时,我希望 htaccess 打开 www.website.com/index.php?s=something。我的当前重定向功能可以正常运行,但如果我有这个“something”作为现有文件夹,则会出现问题。
"s" 代表 "子页面"。
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [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]移动到第3条规则,尝试将有问题的规则与其他规则分开,尽我所能用有限的知识做了一切,但我无法让任何东西工作。
非常感谢任何提示或想法! 在此先感谢您。
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=$1
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /$1.php
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=$1&c=$2
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [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}/$1 [L,R=301]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /$1.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/userpage/([a-zA-Z0-9_-]+)/?$ /c.php?s=$1&c=$2

# I intentionally skipped the conditions here
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [L]


ErrorDocument 400 /index.php
ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
ErrorDocument 500 /index.php
1个回答

0

重写条件仅适用于紧随其后的规则,因此您有1个条件和4个规则。该1个条件仅适用于第一条规则,而其他3条规则没有与之相关的条件。您需要确保所有4个规则不会应用于现有文件或目录的请求:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9_-]+)$ /u.php?u=$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p/([a-zA-Z0-9_-]+)$ /$1.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/<userpage>/([a-zA-Z0-9_-]+)/?$ /c.php?s=$1&c=$2

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /index.php?s=$1 [L]

@CristianBenescu 这是由于mod_dir引起的。如果目录缺少尾部斜杠,Apache将始终重定向请求,如果您想关闭此功能,可以添加DirectorySlash off,但这样做会使人们查看目录内容,即使有索引文件也是如此。 - Jon Lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接