我的网站使用自己的 PHP 框架,可以为页面提供良好的 URL:
About Us => https://www.myurl.com/about
Contacts => https://www.myurl.com/contacts
它在 Vagrant 本地设置中运行良好,但是一旦我将我的网站上传到 Apache2,访问这些网站就会引发:
此服务器上未找到所请求的 URL /about
该服务器上未找到所请求的 URL /contacts。
可能是因为它的优先级是在“关于”和“联系人”文件夹中搜索文件,而不是监听/index.php
定义路线并加载关于或联系页面的视图的文件。
主页中的视图https://www.myurl.com
运行正常,问题发生在 URI 声明的页面之后https://www.myurl.com/.....
这是我的 .conf 文件
ServerAdmin [email protected]
ServerName myurl.com
ServerAlias www.myurl.com
DocumentRoot /var/www/myurl.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.myurl.com [OR]
RewriteCond %{SERVER_NAME} =myurl.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
答案1
在我的 .htaccess 文件中添加以下几行之后,路由终于可以正常工作了:
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
以前当我要去的时候,它会在目录https://www.myurl.com/about
内搜索 index.php 文件。/var/www/myurl.com/public_html/about/
使用 .htaccess 中的新代码,当我转到https://www.myurl.com/about
.htaccess 文件时,首先优先搜索index.php
文件中定义的视图,如果没有加载任何视图,它会搜索具有给定名称的目录。
答案2
我不知道为什么上述配置在 Vagrant 上有效,但在原生 Apache 上无效。我的经验告诉我,当 Apache 的配置不够严格时,它有时有效,有时无效。特别是当您从一个 Apache 版本迁移到另一个版本时。我还多次读到,如果可能的话,最好避免使用重写规则。
因此我更愿意使用单独的配置文件来设置我的虚拟主机,它看起来应该像这样:
ServerName myurl.com # Remove this line if there is another ServerName directive at the global level, or change it to 'ServerName localhost' if you want.
<VirtualHost *:80>
ServerName myurl.com
ServerAlias www.myurl.com
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/myurl.com.error.log
CustomLog ${APACHE_LOG_DIR}/myurl.com.access.log combined
# Redirect Requests to HTTPS
Redirect permanent "/" "https://myurl.com/"
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName myurl.com
ServerAlias www.myurl.com
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/myurl.com.error.log
CustomLog ${APACHE_LOG_DIR}/myurl.com.access.log combined
DocumentRoot /var/www/myurl.com/public_html
<Directory /var/www/myurl.com/public_html>
Options None FollowSymLinks
AllowOverride None
# Use 'AllowOverride All' to enable all .htaccess overrides
DirectoryIndex index.html index.php
Order allow,deny
Allow from all
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /path/to/your/cert.file
SSLCertificateKeyFile /path/to/your/privkey.file
SSLCertificateChainFile /path/to/your/chain.file
</VirtualHost>
</IfModule>
创建新的配置文件:/etc/apache2/sites-available/myurl.com.conf
。您应该在其中粘贴并修改上述行。
禁用当前配置文件。可能您应该使用a2dissite
。然后启用新配置文件:sudo a2ensite myurl.com.conf
。并重新启动 Apache。我认为现在应该可以正常工作了。
此外,在上述配置中,boothhttp://myurl.com
和http://www.myurl.com
会将所有请求重定向到https://myurl.com
。但是,该地址https://www.myurl.com
在请求时将可访问。如果您想要重定向如下:
http://myurl.com
至https://myurl.com
和http://www.myurl.com
到https://www.myurl.com
。
ServerAlias
您应该从定义中删除该指令<VirtualHost *:80>
并创建另一个指令:
<VirtualHost *:80>
ServerName myurl.com
...
Redirect permanent "/" "https://myurl.com/"
</VirtualHost>
<VirtualHost *:80>
ServerName www.myurl.com
...
Redirect permanent "/" "https://www.myurl.com/"
</VirtualHost>
...