从 webhost 移动到本地 Synology 主机后 htaccess 不起作用
htaccess doesn't work after moving from webhost to local Synology host
我有一个托管网站,我在其中使用以下 htaccess 文件来格式化 urls,这些都工作正常。主机使用 Apache,但不幸的是没有显示版本号。我认为是 2.4.
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteRule ^item/([0-9]+)/(.*) /item.php?item=&title= [L]
RewriteRule ^category/(.*) /showitems.php?category= [L]
RewriteRule ^search/(.*) /searching.php?options= [L]
RewriteRule ^searching/(.*) /showitems.php?search= [L]
RewriteRule ^update/(.*) /showitems.php?update= [L]
AddType application/x-httpd-lsphp .html .htm .shtml
我使用 Apache 2.4 将整个站点复制到本地 Synology Diskstation。
重写 url 类别、搜索和更新工作正常。但是,'searching' 和 'item' return 的 url 404 错误。 'Searching' 是来自 'searching.php'
的 header 重定向
Item 在结果 url 中使用 2 个 get 参数的意义上是一个奇怪的地方。在试错模式下,我将其更改为:
RewriteRule ^item/(.*) /item.php?item= [L]
然而这也不起作用
RewriteRule ^itemitem/(.*) /item.php?item= [L]
工作正常,这让我很困惑。当我再次添加第二个参数时,最后一次重写也不起作用。
我错过了什么?或者有没有更好的方法来首先处理这些重写,我可以尝试?
CBroe 对您 post 的评论是正确的答案。
更具体地说,解释为什么如果你的 Apache 2.x 服务器启用了 MultiViews,它将尝试为你匹配目录名、文件名等代表你的东西,以使用户体验更容易。
但是,在许多情况下,这可能会混淆需要非常具体的正则表达式的重写规则。
在大多数情况下,您只需禁用多视图即可。
您可以通过在 .htaccess 文件中添加选项来禁用它。
-MultiViews
请注意,如果 AllowOverrive 目录不允许这样做,那么您需要更改该 vhost/directory 的 Apache 配置文件以包含 -MultiViews 选项。
您可以在此处阅读有关 MultiView 的更多信息:
http://httpd.apache.org/docs/current/content-negotiation.html
另一件事也许是更正确的方法是更好地构建您的重写规则并利用诸如“!-f”或“!-d”参数之类的东西让您的规则知道您不想要包括文件或目录等。
关于 MultiViews 的旁注,即使它非常花哨和简洁 - 如果您是 运行 生产站点,请知道 MultiViews 会产生大量不需要的磁盘 I/O 并且会大大降低 Apache 服务器的性能!因此,禁用 MultiViews 始终是一个好习惯。
我有一个托管网站,我在其中使用以下 htaccess 文件来格式化 urls,这些都工作正常。主机使用 Apache,但不幸的是没有显示版本号。我认为是 2.4.
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteRule ^item/([0-9]+)/(.*) /item.php?item=&title= [L]
RewriteRule ^category/(.*) /showitems.php?category= [L]
RewriteRule ^search/(.*) /searching.php?options= [L]
RewriteRule ^searching/(.*) /showitems.php?search= [L]
RewriteRule ^update/(.*) /showitems.php?update= [L]
AddType application/x-httpd-lsphp .html .htm .shtml
我使用 Apache 2.4 将整个站点复制到本地 Synology Diskstation。
重写 url 类别、搜索和更新工作正常。但是,'searching' 和 'item' return 的 url 404 错误。 'Searching' 是来自 'searching.php'
的 header 重定向Item 在结果 url 中使用 2 个 get 参数的意义上是一个奇怪的地方。在试错模式下,我将其更改为:
RewriteRule ^item/(.*) /item.php?item= [L]
然而这也不起作用
RewriteRule ^itemitem/(.*) /item.php?item= [L]
工作正常,这让我很困惑。当我再次添加第二个参数时,最后一次重写也不起作用。
我错过了什么?或者有没有更好的方法来首先处理这些重写,我可以尝试?
CBroe 对您 post 的评论是正确的答案。 更具体地说,解释为什么如果你的 Apache 2.x 服务器启用了 MultiViews,它将尝试为你匹配目录名、文件名等代表你的东西,以使用户体验更容易。
但是,在许多情况下,这可能会混淆需要非常具体的正则表达式的重写规则。
在大多数情况下,您只需禁用多视图即可。 您可以通过在 .htaccess 文件中添加选项来禁用它。
-MultiViews
请注意,如果 AllowOverrive 目录不允许这样做,那么您需要更改该 vhost/directory 的 Apache 配置文件以包含 -MultiViews 选项。
您可以在此处阅读有关 MultiView 的更多信息:
http://httpd.apache.org/docs/current/content-negotiation.html
另一件事也许是更正确的方法是更好地构建您的重写规则并利用诸如“!-f”或“!-d”参数之类的东西让您的规则知道您不想要包括文件或目录等。
关于 MultiViews 的旁注,即使它非常花哨和简洁 - 如果您是 运行 生产站点,请知道 MultiViews 会产生大量不需要的磁盘 I/O 并且会大大降低 Apache 服务器的性能!因此,禁用 MultiViews 始终是一个好习惯。