繁体   English   中英

如何修复:RewriteRule 在 .htaccess 中不起作用

[英]How to fix: RewriteRule not working in .htaccess

请考虑我的.htaccess中的内容:

##
Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /

## Allow a few SEO Files direct access.
RewriteRule ^robots.txt?$ robots.txt [L]
RewriteRule ^ads.txt?$ ads.txt [L]
RewriteRule ^sellers.json?$ sellers.json [L]


## Avoid rewriting rules for the admin section
RewriteRule ^(admin|resources)($|/) - [L]

## Set Ajax Request File
RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]

## Set controller with id
RewriteRule ^([^/]+)/([0-9]+)/?$ index.php?con=$1&id=$2 [L,QSA]

## Set controller with slug
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?con=$1&slug=$2 [L,QSA]

## For paging
RewriteRule ^([^/]+)/page/([0-9]+)/?$ index.php?con=$1&page=$2 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/page/([0-9]+)/?$ index.php?con=$1&slug=$2&page=$3 [L,QSA]

## Set controller for only one parameter
RewriteRule ^page/([^/]+)/?$ index.php?con=page&slug=$1 [L,QSA]
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]

## Set home page
RewriteRule ^/?$ index.php?con=home [L]

每当我尝试浏览http://example.com/kahuk-ajax/?prefix=manage-story-vote时,都会打开index.php而不是kahuk-ajax.php

我究竟做错了什么?

## Set Ajax Request File RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]: ## Set controller for only one parameter: RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]

该请求首先被第一条规则重写为kakuk-ajax.php ,但倒数第二条规则随后在重写引擎的第二次传递期间将其重写为index.php

您需要防止第二条规则重写kakuk-ajax.php形式的请求。 如果这些 URL 在第一个路径段(通常分隔文件扩展名)中不包含点,那么您可以简单地在否定字符 class 中包含一个点。例如:

## Set controller for only one parameter
:
RewriteRule ^([^/.]+)/?$ index.php?con=$1 [L,QSA]

或者,排除特定的文件扩展名:

RewriteCond %{REQUEST_URI} \.(txt|json|php)$
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]

或者,任何看起来像具有文件扩展名的 URL:

RewriteCond %{REQUEST_URI} \.\w{2,5}$
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]

在旁边:

 RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]

这个规则有点矛盾。 您要删除尾随? , 但随后再次附加QSA标志。 如果您希望保留查询字符串,则两者都不需要。 由于您正在捕获 URL 路径,因此您不妨在替换字符串中使用它。 例如:

RewriteRule ^(kahuk-ajax)/?$ $1.php [L]

另外,请注意不要在此处使用可选的尾部斜杠。 这会促进可能导致 SEO 问题的重复内容。 考虑将一个重定向到另一个。

 ## Allow a few SEO Files direct access. RewriteRule ^robots.txt?$ robots.txt [L] RewriteRule ^ads.txt?$ ads.txt [L] RewriteRule ^sellers.json?$ sellers.json [L]

? 在正则表达式的末尾使前面的字符(上面示例中的tn )可选,这在这里没有真正意义。 此外,您不需要重写同一个文件——您不希望此处发生任何重写/替换。 所以,上面的是一样的:

RewriteRule ^(robots\.txt|ads\.txt|sellers.json)$ - [L]

- (连字符)明确表示“无替代”。

然而,在上面的(否定字符类)指令中包含了一个“点”,这个指令是多余的,除了“提前失败”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM